package tools

import (
	"fmt"
	"log"
	"sync"

	"prometheus_import_consul/common"
	myflags "prometheus_import_consul/flag"
	"prometheus_import_consul/global"

	"github.com/tealeg/xlsx/v3"
)

type ExcelToJson struct {
	File  *xlsx.File
	Sheet *xlsx.Sheet
}

func newExcelToJson(filePath, sheetName string) (*ExcelToJson, error) {
	file, err := xlsx.OpenFile(filePath)
	if err != nil {
		log.Fatalf("open xlsx file failed:%v\n", err)
		return nil, err
	}
	log.Printf("open xlsx file success:%s\n", filePath)
	sheet, ok := file.Sheet[sheetName]
	if !ok {
		return nil, fmt.Errorf("sheet %s not found", sheetName)
	}

	return &ExcelToJson{File: file, Sheet: sheet}, nil
}

// 使用common包中的ParseHostInfo方法 将xlsx中的hostinfo页解析并存到host.json文件中
func (e *ExcelToJson) ParseXLSXHost() error {
	if err := EnsureDir(global.Config.JsonFile.Hostjson_Path); err != nil {
		return fmt.Errorf("failed to ensure directory for host json: %w", err)
	}
	return common.ParseHostInfo(e.Sheet, global.Config.JsonFile.Hostjson_Path)
}

// 使用common包中的ParseServiceInfo方法 将xlsx中的serviceinfo页解析并存到service.json文件中
func (e *ExcelToJson) ParseXLSXService() error {
	if err := EnsureDir(global.Config.JsonFile.Servicejson_Path); err != nil {
		return fmt.Errorf("failed to ensure directory for service json: %w", err)
	}
	return common.ParseServiceInfo(e.Sheet, global.Config.JsonFile.Servicejson_Path)
}

// 使用common包中的ParseServiceUrlInfo方法 将xlsx中的serviceUrlinfo页解析并存到serviceUrl.json文件中
func (e *ExcelToJson) ParseXLSXServiceUrl() error {
	if err := EnsureDir(global.Config.JsonFile.ServiceUrljson_Path); err != nil {
		return fmt.Errorf("failed to ensure directory for serviceurl json: %w", err)
	}
	return common.ParseServiceUrlInfo(e.Sheet, global.Config.JsonFile.ServiceUrljson_Path)
}

// 处理Execl文件的逻辑函数入口
var SharedResource string
var mutex sync.Mutex // 声明互斥锁
func ProcessExcelFiles(cmdFlags myflags.CmdFlags) {
	//创建匿名切片结构体并初始化
	sheetActions := []struct {
		Flag   bool
		Sheet  string
		Action func(*ExcelToJson) error
	}{
		{cmdFlags.ParseHost, global.Config.Xlsx.SheetName[0], (*ExcelToJson).ParseXLSXHost},
		{cmdFlags.ParseService, global.Config.Xlsx.SheetName[1], (*ExcelToJson).ParseXLSXService},
		{cmdFlags.ParseServiceURL, global.Config.Xlsx.SheetName[2], (*ExcelToJson).ParseXLSXServiceUrl},
	}
	var wg sync.WaitGroup
	errChan := make(chan error, len(sheetActions))
	for _, action := range sheetActions {
		if action.Flag {
			wg.Add(1)
			go func(action struct {
				Flag   bool
				Sheet  string
				Action func(*ExcelToJson) error
			}) {
				defer wg.Done()
				e, err := newExcelToJson(global.Config.Xlsx.XlsxFile_Path, action.Sheet)
				if err != nil {
					log.Fatalf("实例化ExcelToJson结构体失败,%v\n", err)
					errChan <- err
					return
				}
				if err := action.Action(e); err != nil {
					errChan <- err
					return
				}

				// 示例：安全更新共享资源
				mutex.Lock() // 在访问共享资源前加锁
				SharedResource = "更新共享资源的值"
				mutex.Unlock() // 完成后解锁
			}(action)
		}
	}

	wg.Wait()
	close(errChan)

	for err := range errChan {
		if err != nil {
			log.Fatalf("Error processing sheet: %v", err)
		}
	}
}
